#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""DocString

DocString Paragraph

"""
#Importamos el módulo para hacer llamadas al sistema
import subprocess
from optparse import OptionParser
import logging
import sys

#Para el archivo de logs
MYAPP = 'ipmi_check_temp'
ARCHIVO_LOG = MYAPP+'.log'
PATH_LOG = '/var/log/'
logging.basicConfig(level = logging.INFO,
        format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt = '%Y-%m-%d %H:%M:%S',
        filename = PATH_LOG+ARCHIVO_LOG,
        filemode = 'aw')


#Orden para consultar los parámetro full con ipmi


def visualiza_dict_ipmi(dict_ipmi):
    """
    Función que visualiza correctamente los campos del 
    diccionario ipmi
    Recibe como parámetro el diccionario
    """
    for key  in dict_ipmi.keys():
        print key + ": " + dict_ipmi[key]

def get_sensor_ipmi(sensor, dict_ipmi):
    """
    Función a la que le pasamos el nombre de un sensor
    y nos devuelve su valor. El nombre tiene que ser exacto
    """
    if sensor in dict_ipmi:
        return dict_ipmi[sensor]
    else:
        return "0 (No existe)"

def get_valor_numerico_sensor(sensor):
    """
    Esta función recibe el string con el valor del sensor compuesto por
    un valor numérico y una cadena y devuelce sólo el número
    """
    valor_numerico = sensor.split(" ")[0].strip()
    return int(valor_numerico)

def get_ipmi_valores(ip_ipmi, user, passwd, type_sdr):    
    """
    Función que obtiene los valores ipmi de la máquina indicada
    Devuelve un diccionario donde el key es el nombre del sensor
    y el contenido su valor
    """
    #Diccionario en el que guardaremos los valores ipmi obtenidos
    valores_ipmi = {}                              
    # Comando ipmi
    cmd = [\
        "ipmitool", \
        "-Ilan",\
        "-H"+ip_ipmi,\
        "-U"+user,\
        "-P"+passwd,\
        "sdr",\
        "list",\
        type_sdr\
        ]

    process = subprocess.Popen(cmd, 0, shell=False,
        stdout=subprocess.PIPE, )
    values = process.communicate()[0].split("\n")

    for line in values:
        sensor = line.split(" | ")
        if sensor[0] != '':
            valores_ipmi[sensor[0].strip()] = sensor[1].strip()

    return valores_ipmi

def main():
    """
    Función general

    """
    valores_ipmi = {}
    
    parser = OptionParser()
    parser.add_option("-t", "--temperature", 
            action = "store_true",
            dest = "temp",
            help = 'Muestra la temperatura del Panel Frontal (FPT) y '\
                'de la placa base (BT)',
            default = False) 

    parser.add_option("-v", "--visualiza-sensores", 
            action = "store_true",
            dest = "visualiza",
            help = u"Muestra la información de todos los sensores",
            default = False) 

    parser.add_option("-i", "--ip", 
            dest = "ip_ipmi",
            help = u"IP de la máquina que quieres chequear los sensores",
            default = "192.168.2.201") 
    
    parser.add_option("-l", "--list-srd", 
            dest = "list_ipmi",
            help = "Tipo de listado: full|all",
            default = "full") 
    
    parser.add_option("-u", "--user", 
            dest = "user_ipmi",
            help = u"Usuario de conexión IPMI",
            default = "root") 
    
    parser.add_option("-p", "--password", 
            dest = "passwd_ipmi",
            help = u"Contraseña de acceso",
            default = "123qwe") 

    parser.add_option("--log", 
            action = "store_true",
            dest = "log",
            help = u"Hace una entrada en el archivo de log",
            default = False) 

    parser.add_option("-n", 
            action = "store_true",
            dest = "nagios",
            help = u"Activa la salida para el Nagios",
            default = False) 
    
    parser.add_option("--nagios-limits", 
            dest = "nagios_limites",
            help = u"Limites del nagios",
            default = '25,30') 
    
    (options, args) = parser.parse_args()
   
    ip_ipmi = options.ip_ipmi
    type_sdr = options.list_ipmi #full, all
    user = options.user_ipmi 
    passwd = options.passwd_ipmi


    if options.temp | options.visualiza | options.log | options.nagios:
        valores_ipmi = get_ipmi_valores(ip_ipmi, user, passwd, type_sdr)

    
    if options.temp:
        print "FPT: %d" % (get_valor_numerico_sensor(get_sensor_ipmi(
            'Front Panel Temp', valores_ipmi)))
        print "BT: %d" % (get_valor_numerico_sensor(get_sensor_ipmi(
            'Baseboard Temp', valores_ipmi)))

    elif options.visualiza:
        visualiza_dict_ipmi(valores_ipmi)

    elif options.log:
        logging.info(
            'ºC | FPT: ' + str(get_valor_numerico_sensor(get_sensor_ipmi(
                'Front Panel Temp', valores_ipmi))) +  \
            ' | BT: ' + str(get_valor_numerico_sensor(get_sensor_ipmi(
            'Baseboard Temp', valores_ipmi))) + ' | ' + \
            ip_ipmi)


    elif options.nagios:
        #Determine state to pass to Nagios
        #CRITICAL = 2
        #WARNING = 1
        #OK = 0
        FPT = get_valor_numerico_sensor(get_sensor_ipmi(
            'Front Panel Temp', valores_ipmi))
        limits = options.nagios_limites.split(',')
        
        if FPT >= int(limits[1]):
            print u"Temperatura Frontal CRITICA: %d ºC" % (FPT)
            sys.exit(2)
        elif FPT >= int(limits[0]):
            print u"Temperatura Frontal ELEVADA - WARNING: %d ºC" % (FPT)
            sys.exit(1)
        else:
            print u"Temperatura Frontal NORMAL: %d ºC" % (FPT)
            sys.exit(0)

    else:
        print u"No has elegido opción"
        sys.exit(0)
            
 
if __name__ == "__main__":
    main()

__version__ = "$Revision$"
# $Source$

